From 2db97700d4b64790a80e086bfa161f549cc2d946 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Fri, 21 Aug 2009 17:14:35 +0100 Subject: [PATCH] x86: Ensure irq is disabled before taking vector_lock. Fixed debug lock issue for taking vector lock. Signed-off-by: Xiantao Zhang --- xen/arch/x86/io_apic.c | 9 ++++++--- xen/arch/x86/irq.c | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c index ea7f8b2fa4..bc9ecd90cb 100644 --- a/xen/arch/x86/io_apic.c +++ b/xen/arch/x86/io_apic.c @@ -379,6 +379,7 @@ unsigned int set_desc_affinity(struct irq_desc *desc, cpumask_t mask) struct irq_cfg *cfg; unsigned int irq; int ret; + unsigned long flags; cpumask_t dest_mask; if (!cpus_intersects(mask, cpu_online_map)) @@ -386,11 +387,13 @@ unsigned int set_desc_affinity(struct irq_desc *desc, cpumask_t mask) irq = desc->irq; cfg = desc->chip_data; - - lock_vector_lock(); + + local_irq_save(flags); + lock_vector_lock(); ret = __assign_irq_vector(irq, cfg, mask); unlock_vector_lock(); - + local_irq_restore(flags); + if (ret < 0) return BAD_APICID; diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index c1105802e3..1f5e1a666d 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -55,6 +55,7 @@ DEFINE_PER_CPU(vector_irq_t, vector_irq) = { DEFINE_PER_CPU(struct cpu_user_regs *, __irq_regs); +/* Must be called when irq disabled */ void lock_vector_lock(void) { /* Used to the online set of cpus does not change -- 2.30.2